package br.com.hstar.client.patrimonio;

import br.com.hstar.client.ServiceFactory;
import br.com.hstar.client.util.FormPanel;
import br.com.hstar.client.util.HstarDialogBox;
import br.com.hstar.client.util.HstarUserException;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class PatrimonioEditPanel extends FormPanel {

	private Button incluir;
	private Button cancelar;
	private Button excluir;
	
	private TextBox nome;
	private TextBox quantidade;
	private TextBox precoCompra;
	private TextArea descricao;
	
	private PatrimonioUI patrimonioUI;

	public PatrimonioEditPanel(String _title) {
		super(_title);
		patrimonioUI = new PatrimonioUI();
		init(true);
	}
	
	public PatrimonioEditPanel(String _title, Long id) {
		super(_title);
		patrimonioUI = new PatrimonioUI();
		patrimonioUI.setId(id);
		init(false);
		ServiceFactory.createPatrimonioService().retrieveById(id, new RetrieveAsyncCallback());
	}
	
	
	
	//Methods -------------------------------------------------------------------
	
	private void init(boolean isNew) {

		nome 		= addTextBox("Nome", 40, 50, "");
		quantidade 	= addTextBox("Quantidade", 8, 8, "");
		precoCompra = addTextBox("Preço de Compra", 15, 15, "");
		descricao 	= addTextArea("Descrição", "200", "150", "");
		
		if(isNew) {
			incluir  = addButton("Incluir");
			cancelar = addButton("Cancelar");
		} else {
			incluir  = addButton("Alterar");
			cancelar = addButton("Cancelar");
			excluir = addButton("Excluir");
			excluir.addClickListener(new ClickListener() {
				public void onClick(Widget sender) {
					ServiceFactory.createPatrimonioService().delete(patrimonioUI.getId(), new DeleteAsyncCallback());
				}
			});
		}
		
		incluir.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				 try {
					copyData();
					ServiceFactory.createPatrimonioService().saveOrUpdate(patrimonioUI, new SaveAsyncCallback());
				} catch (HstarUserException e) {
					new HstarDialogBox("Patrimonio", e.getMessage());					
				}
				 
			}
		});
		cancelar.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				RootPanel.get("boxContent").clear();
				RootPanel.get("boxContent").add(new PatrimonioListPanel("Patrimonio"));
			}
		});
		
	}

	private void copyData() throws HstarUserException {
		String msgErro = "";
		
		if(nome.getText().trim() == ""){
			msgErro += " - Digite o nome do patrimonio <br>";			
		}
		if(quantidade.getText().trim() == ""){
			msgErro += " - Digite a quantidadevdo patrimonio <br>";			
		}
		if(precoCompra.getText().trim() == ""){
			msgErro += " - Digite o preço de compra do patrimonio <br>";			
		}
		if(descricao.getText().trim() == ""){
			msgErro += " - Digite a descrição do patrimonio <br>";			
		}
		
		try{
			patrimonioUI.setQuantidade(new Integer(quantidade.getText().trim()));
		} catch (NumberFormatException nf) {
			msgErro += " - Quantidade deve ser um número inteiro<br>";
		}
		
		try{
			patrimonioUI.setPrecoCompra(new Double(precoCompra.getText().trim()));
		} catch (NumberFormatException nf) {
			msgErro += " - Preco de compra deve ser do tipo monetário (Ex: 11,43)<br>";
		}
		
		if(msgErro != "")
		{
			throw new HstarUserException(msgErro);			
		}
			
		patrimonioUI.setNome(nome.getText().trim());
		if(!quantidade.getText().equals(""))
		patrimonioUI.setQuantidade(new Integer(quantidade.getText().trim()));
		if(!precoCompra.getText().equals(""))
		patrimonioUI.setPrecoCompra(new Double(precoCompra.getText().trim()));
		patrimonioUI.setDescricao(descricao.getText().trim());
	}

	// INNER CLASSES ----------------------------------------------------------------
	private class SaveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			if(caught instanceof HstarUserException)
			{					
				new HstarDialogBox("Patrimonio",caught.getMessage());
			}
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new PatrimonioListPanel("Patrimonio"));
		}
	}
	
	private class DeleteAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Patrimonio");
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new PatrimonioListPanel("Patrimonio"));
		}
	}
	
	//carrega os campos. Usado para quando está editando
	private class RetrieveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Patrimonio");
		}

		public void onSuccess(Object result) {
			PatrimonioUI patri = (PatrimonioUI)result;
			nome.setText(patri.getNome().trim());
			quantidade.setText(patri.getQuantidade().toString());
			precoCompra.setText(patri.getPrecoCompra().toString());
			descricao.setText(patri.getDescricao().trim());
		}
	}
}      